case GSK_COLOR_NODE:
{
- RenderOp op;
-
ops_set_program (builder, &self->color_program);
- op.op = OP_CHANGE_COLOR;
- op.color = *gsk_color_node_peek_color (node);
- ops_add (builder, &op);
+ ops_set_color (builder, gsk_color_node_peek_color (node));
ops_draw (builder, vertex_data);
}
break;
}
else
{
- RenderOp op;
-
ops_set_program (builder, &self->coloring_program);
-
- op.op = OP_CHANGE_COLOR;
- op.color = *gsk_text_node_peek_color (node);
- ops_add (builder, &op);
+ ops_set_color (builder, gsk_text_node_peek_color (node));
}
/* We use one quad per character, unlike the other nodes which
return prev_opacity;
}
+void
+ops_set_color (RenderOpBuilder *builder,
+ const GdkRGBA *color)
+{
+ RenderOp op;
+
+ g_assert (builder->current_program->color_location != 0);
+
+ if (gdk_rgba_equal (color, &builder->program_state[builder->current_program->index].color))
+ return;
+
+ builder->program_state[builder->current_program->index].color = *color;
+
+ op.op = OP_CHANGE_COLOR;
+ op.color = *color;
+ g_array_append_val (builder->render_ops, op);
+}
+
void
ops_draw (RenderOpBuilder *builder,
const GskQuadVertex vertex_data[GL_N_VERTICES])
graphene_matrix_t projection;
int source_texture;
graphene_rect_t viewport;
+ /* Per-program state */
+ union {
+ GdkRGBA color;
+ };
} program_state[GL_N_PROGRAMS];
/* Current global state */
float ops_set_opacity (RenderOpBuilder *builder,
float opacity);
+void ops_set_color (RenderOpBuilder *builder,
+ const GdkRGBA *color);
void ops_draw (RenderOpBuilder *builder,
const GskQuadVertex vertex_data[GL_N_VERTICES]);